package com.agilya.controller;

import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import javax.inject.Inject;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.agilya.dao.DAOChapitre;
import com.agilya.dao.DAOQCM;
import com.agilya.dao.DAOQuestion;
import com.agilya.dao.daointerface.ChapitreDAO;
import com.agilya.dao.daointerface.QCMDAO;
import com.agilya.dao.daointerface.QuestionDAO;
import com.agilya.dao.exception.DAOExceptions;
import com.agilya.modele.Chapitre;
import com.agilya.modele.QCM;
import com.agilya.modele.Question;

/**
 * Servlet implementation class AffecterQuestionQCM
 * 
 * Permet d'affecter ou de désaffecter des questions à un QCM.
 * 
 * Affiche la liste des questions contenues dans un qcm, ainsi que la liste des questions par chapitres que l'utilisateur peut ou non affecter
 * 
 */
@WebServlet("/AffecterQuestionQCM")
public class AffecterQuestionQCM extends HttpServlet {
	private static final long serialVersionUID = 1L;

	@Inject
	@DAOChapitre
	private ChapitreDAO chapitreDAO;

	@Inject
	@DAOQCM
	private QCMDAO qcmDAO;

	@Inject
	@DAOQuestion
	private QuestionDAO questionDAO;

	/**
	 * @see HttpServlet#HttpServlet()
	 */
	public AffecterQuestionQCM() {
		super();
	}

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// Déclaration des variables
		Integer idQCM = null;
		QCM qcm = null;
		List<Chapitre> listeChapitres = null;
		HashMap<Chapitre, List<Question>> listeChapitresEtQuestions = new HashMap<>();

		RequestDispatcher rd = request.getRequestDispatcher("page.jsp");

		try {
			// Récupération de l'id du QCM
			idQCM = Integer.parseInt(request.getParameter("idQCM"));

			// Récupération idQCM + question avec proposition ---> pour pouvoir faire une preview
			qcm = qcmDAO.getQCMbyId(idQCM);
			qcm.setListeQuestions(questionDAO.getAllQuestionsEtPropositionsByQCM(idQCM));

			// Récupération des chapitres du qcm
			listeChapitres = chapitreDAO.getAllChapitreByQCM(idQCM);

			List<Question> listeTempQuestions = null;
			// Récupération des questions par qcm
			for (Chapitre chapitre : listeChapitres) {
				listeTempQuestions = questionDAO.getAllQuestionEtPropositionsByChapitre(chapitre.getId());
				listeChapitresEtQuestions.put(chapitre, listeTempQuestions);
			}

			// on met en paramètre le qcm
			request.setAttribute("qcm", qcm);
			// on met en paramètre la liste chapitre
			request.setAttribute("listeChapitres", listeChapitres);
			// on met en paramètre la liste chapitre et question
			request.setAttribute("listeChapitresEtQuestions", listeChapitresEtQuestions);

			// on redirige vers la jsp
			request.setAttribute("page", "/affecterQuestionQCM.jsp");
			rd = request.getRequestDispatcher("page.jsp");
		} catch (DAOExceptions daoExceptions) {
			// Impossible d'interroger la base de données
			request.setAttribute("erreurPage", "Une erreur est survenue, veuillez recommencer plus tard");
			daoExceptions.printStackTrace();
		} catch (NumberFormatException | NullPointerException e) {
			// Impossible de retrouver l'idqcm
			rd = request.getRequestDispatcher("/AfficherQCM");
			request.setAttribute("erreurPage", "Une erreur est survenue, veuillez recommencer plus tard");

		}
		rd.forward(request, response);

	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		RequestDispatcher rd = request.getRequestDispatcher("/AfficherQCM");

		try {
			// On récupére id du qcm
			int idQCM = Integer.parseInt(request.getParameter("idQCM"));

			// On récupère l'action
			String action = request.getParameter("action");

			// On récupère la liste des questions sélectionnées
			List<Integer> listeIDQuestion = new ArrayList<>();
			String[] tempListeQuestions = request.getParameterValues("question");
			if (tempListeQuestions != null) {
				for (String id : tempListeQuestions) {
					listeIDQuestion.add(Integer.parseInt(id));
				}
			}
			if (action.equals("desaffecter")) {
				qcmDAO.desaffecterQuestionsQCM(idQCM, listeIDQuestion);
				doGet(request, response);
			} else if (action.equals("affecter")) {
				qcmDAO.affecterQuestionsQCM(idQCM, listeIDQuestion);
				doGet(request, response);
			}

		} catch (NumberFormatException | NullPointerException e) {
			// retour à la liste des qcm
			rd = request.getRequestDispatcher("/AfficherQCM");
			request.setAttribute("erreurPage", "Une erreur est survenue, veuillez recommencer plus tard");
			e.printStackTrace();

		} catch (DAOExceptions e) {
			// Problème avec la base de données
			request.setAttribute("erreurPage", "Une erreur est survenue, veuillez recommencer plus tard");
			e.printStackTrace();
		}

		rd.forward(request, response);
	}
}
